package com.zhoujiang.chapter4.intercptor;

import com.zhoujiang.chapter4.invoke.Invocation;

import java.lang.reflect.InvocationTargetException;

public interface Interceptor {
    /**
     * 事前方法
     * @return
     */
    public boolean before();

    /**
     * 事后方法
     */
    void after();

    /**
     * 取带原有事件的方法
     * @param invocation
     * @return
     * @throws InvocationTargetException
     * @throws IllegalAccessError
     */
    Object around(Invocation invocation)throws InvocationTargetException,IllegalAccessError, IllegalAccessException;

    /**
     * 事后返回方法，没有异常发生
     */
    void afterReturning();

    /**
     * 事后返回方法，有异常发生
     */
    void afterThroing();

    /**
     * 判断是否取带原有方法
     * @return
     */
    boolean useAround();
}
